From: Andreas Schwab Date: Sun, 22 Nov 2009 12:11:00 +0000 (+0000) Subject: (simple_search): Avoid CHAR_TO_BYTE in inner loop when X-Git-Tag: archive/raspbian/1%29.2+1-2+rpi1~1^2~324^2~9308 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https:/www.github.com/%22bookmarks:///%22http:/www.example.com/cgi/%22https:/www.github.com/%22bookmarks:/?a=commitdiff_plain;h=244da40ecef4172b2c36089a38d29ac52112f0fd;p=emacs.git (simple_search): Avoid CHAR_TO_BYTE in inner loop when searching backwards through multibyte buffer. --- diff --git a/src/ChangeLog b/src/ChangeLog index a4bdee4c812..9ecb85bc2c5 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2009-11-22 Andreas Schwab + + * search.c (simple_search): Avoid CHAR_TO_BYTE in inner loop when + searching backwards through multibyte buffer. + 2009-11-21 Jan Djärv * xterm.c: #include xgselect.h. diff --git a/src/search.c b/src/search.c index fd45d316a46..abbad764c3c 100644 --- a/src/search.c +++ b/src/search.c @@ -1609,39 +1609,36 @@ simple_search (n, pat, len, len_byte, trt, pos, pos_byte, lim, lim_byte) while (1) { /* Try matching at position POS. */ - EMACS_INT this_pos = pos - len; - EMACS_INT this_pos_byte; + EMACS_INT this_pos = pos; + EMACS_INT this_pos_byte = pos_byte; int this_len = len; - unsigned char *p = pat; + unsigned char *p = pat + len_byte; - if (this_pos < lim || (pos_byte - len_byte) < lim_byte) + if (this_pos - len < lim || (pos_byte - len_byte) < lim_byte) goto stop; - this_pos_byte = CHAR_TO_BYTE (this_pos); - match_byte = pos_byte - this_pos_byte; while (this_len > 0) { - int charlen, buf_charlen; + int charlen; int pat_ch, buf_ch; - pat_ch = STRING_CHAR_AND_LENGTH (p, charlen); - buf_ch = STRING_CHAR_AND_LENGTH (BYTE_POS_ADDR (this_pos_byte), - buf_charlen); + DEC_BOTH (this_pos, this_pos_byte); + PREV_CHAR_BOUNDARY (p, pat); + pat_ch = STRING_CHAR (p); + buf_ch = STRING_CHAR (BYTE_POS_ADDR (this_pos_byte)); TRANSLATE (buf_ch, trt, buf_ch); if (buf_ch != pat_ch) break; this_len--; - p += charlen; - this_pos_byte += buf_charlen; - this_pos++; } if (this_len == 0) { - pos -= len; - pos_byte -= match_byte; + match_byte = pos_byte - this_pos_byte; + pos = this_pos; + pos_byte = this_pos_byte; break; }